package org.stars.daostars;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.stars.dao.exception.DaoException;
import org.stars.daostars.core.DaoStars;
import org.stars.daostars.sqlmapper.SqlMapper;
import org.stars.util.StringUtility;
import org.stars.util.diagnostic.StackTraceDiagnosticHelper;

/**
 * Utility class for daoBase.
 * 
 * @author Francesco Benincasa
 *
 */
public abstract class DaoBaseNewHelper {

	public static Log getLog()
	{
		return LogFactory.getLog(DaoBaseNewHelper.class);
	}
	
	/**
	 * Dato un entityBean passato come parametro, cerca di costruire l'elenco
	 * delle query e dei relativi parametri. La ricerca delle definizione delle
	 * query e dei relativi parametri avviene mediante nome. Del nome della
	 * classe non viene considerato il percorso dei package, quindi due entity
	 * bean in due package diversi ma con lo stesso nome usufruiranno delle
	 * stesse definizioni.
	 * 
	 * @param entity
	 *            EntityBean
	 */
	public static String getDaoNameFromEntity(Class<?> clazz) {
		String sRet = "";
		String temp = "";
		
		try {			
			temp = clazz.getName();

			temp = temp.substring(temp.lastIndexOf(".") + 1);
			temp = StringUtility.replace(temp,"Eb", "Dao");

			if (!temp.startsWith("Dao")) {
				temp = "Dao" + temp;
			}

			sRet = temp;
		} catch (Exception e) {
			Log log = getLog();
			log.fatal("Error during the initialization of the dao " + temp + " :" + e.toString());
		}

		return sRet;
	}
	
	/**
	 * @param sqlMapperName
	 * 		name of the sqlMapper
	 * @return
	 * 		sqlMapper	
	 */
	public static SqlMapper getSqlMapper(String sqlMapperName) {
		SqlMapper ret = null;
		try {
			ret = DaoStars.getInstance().getSqlMapper(sqlMapperName);

			if (ret == null)
				throw (new DaoException("The definition of the dao " + sqlMapperName + " is missed."));

		} catch (Exception e) {
			Log log = getLog();
			log.fatal("Error during the initialization of the dao " + sqlMapperName + " :" + e.toString());
		}

		return ret;
	}
	
	/**
	 * get the stack trace applying the configured stack trace diagnostic handler.
	 * 
	 * @param config
	 * @return
	 */
	public static String getStackTrace(QueryConfig config) {
		if (config.isDebugMode() && config.getStackTraceDiagnosticHandler().isEnabled()) {
			List<String> lista = StackTraceDiagnosticHelper.getStackInfoList(config.getStackTraceDiagnosticHandler());

			StringBuilder sb=new StringBuilder();
			
			for (String item : lista) {
				sb.append(item);				
			}
			
			return sb.toString();
		} else {
			return "";
		}
	}
}
